home *** CD-ROM | disk | FTP | other *** search
Wrap
package koala.dynamicjava.interpreter; import java.lang.reflect.Modifier; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.ListIterator; import koala.dynamicjava.classfile.InnerClassesEntry; import koala.dynamicjava.classinfo.ClassInfo; import koala.dynamicjava.classinfo.ConstructorInfo; import koala.dynamicjava.classinfo.TreeClassInfo; import koala.dynamicjava.classinfo.TreeConstructorInfo; import koala.dynamicjava.interpreter.error.ExecutionError; import koala.dynamicjava.tree.BlockStatement; import koala.dynamicjava.tree.ConstructorDeclaration; import koala.dynamicjava.tree.ConstructorInvocation; import koala.dynamicjava.tree.MethodDeclaration; import koala.dynamicjava.tree.Node; import koala.dynamicjava.tree.TypeDeclaration; import koala.dynamicjava.tree.VoidType; import koala.dynamicjava.util.ImportationManager; public class ClassInfoCompiler { protected TreeClassInfo classInfo; protected TypeDeclaration typeDeclaration; protected ClassFactory classFactory; protected TreeClassFinder classFinder; protected TreeInterpreter interpreter; protected boolean isInterface; protected boolean hasAbstractMethod; protected List classInitializer = new LinkedList(); protected List instanceInitializer = new LinkedList(); protected MembersVisitor membersVisitor; protected ImportationManager importationManager; // $FF: synthetic field private static Class class$Ljava$lang$Object; // $FF: synthetic field private static Class class$Ljava$lang$String; public Class compile() { ClassInfo var1 = this.classInfo.getDeclaringClass(); if (var1 != null) { var1.getName(); } else { Object var10000 = null; } int var3 = this.typeDeclaration.getAccessFlags(); String var4 = this.classInfo.getName(); if (this.isInterface) { var3 |= 512; } this.classFactory = new ClassFactory(var3, var4, this.classInfo.getSuperclass().getName(), this.interpreter.getClass(), this.interpreter.getExceptionClass(), this.interpreter.getClassLoader().toString()); if (var1 != null) { this.addInnerClassesAttribute(this.classInfo); } ClassInfo[] var5 = this.classInfo.getDeclaredClasses(); for(int var6 = 0; var6 < var5.length; ++var6) { String var7 = var5[var6].getName(); InnerClassesEntry var8 = this.classFactory.addInnerClassesEntry(); var8.setInnerClassInfo(var7); var8.setOuterClassInfo(var4); var8.setInnerName(var7.substring(var4.length() + 1, var7.length())); var8.setInnerClassAccessFlags((short)var5[var6].getModifiers()); } ClassInfo[] var10 = this.classInfo.getInterfaces(); for(int var11 = 0; var11 < var10.length; ++var11) { this.classFactory.addInterface(var10[var11].getName()); } Iterator var12 = this.typeDeclaration.getMembers().iterator(); while(var12.hasNext()) { ((Node)var12.next()).acceptVisitor(this.membersVisitor); } if (!this.isInterface && this.hasAbstractMethod && !Modifier.isAbstract(var3)) { this.typeDeclaration.setProperty("errorStrings", new String[]{var4}); throw new ExecutionError("misplaced.abstract", this.typeDeclaration); } else { if (!this.isInterface) { ConstructorInfo[] var13 = this.classInfo.getConstructors(); for(int var9 = 0; var9 < var13.length; ++var9) { this.addConstructor((TreeConstructorInfo)var13[var9]); } } if (this.classInitializer.size() > 0) { this.interpreter.registerMethod(this.classFactory.createClassInitializer(), new MethodDeclaration(1, new VoidType(), "<clinit>", new LinkedList(), new LinkedList(), new BlockStatement(this.classInitializer)), this.importationManager); } TreeClassLoader var14 = (TreeClassLoader)this.interpreter.getClassLoader(); return var14.defineClass(var4, this.classFactory.getByteCode()); } } protected void addConstructor(TreeConstructorInfo var1) { ClassInfo[] var2 = var1.getParameterTypes(); String[] var3 = new String[var2.length]; for(int var4 = 0; var4 < var2.length; ++var4) { var3[var4] = var2[var4].getName(); } var2 = var1.getExceptionTypes(); String[] var13 = new String[var2.length]; for(int var5 = 0; var5 < var2.length; ++var5) { var13[var5] = var2[var5].getName(); } String var14 = ClassFactory.getMethodIdentifier(this.classInfo.getName(), "<init>", var3, this.interpreter.getClassLoader().toString()); ConstructorDeclaration var6 = var1.getConstructorDeclaration(); if (!var6.getName().equals(this.typeDeclaration.getName())) { var6.setProperty("errorStrings", new String[]{var6.getName()}); throw new ExecutionError("constructor.name", var6); } else { ConstructorInvocation var7 = var6.getConstructorInvocation(); ConstructorVisitor var10000 = new ConstructorVisitor; if (this == null) { throw null; } else { var10000.<init>(this); ConstructorVisitor var8 = var10000; if (var7 != null) { Iterator var9 = var6.getParameters().iterator(); while(var9.hasNext()) { ((Node)var9.next()).acceptVisitor(var8); } var7.acceptVisitor(var8); this.interpreter.registerConstructorArguments(var14, var6.getParameters(), var7.getArguments(), this.importationManager); } else { this.interpreter.registerConstructorArguments(var14, new LinkedList(), new LinkedList(), this.importationManager); } MethodDeclaration var15 = new MethodDeclaration(var6.getAccessFlags(), new VoidType(), "<init>", var6.getParameters(), new LinkedList(), new BlockStatement(var6.getStatements())); this.interpreter.registerMethod(var14, var15, this.importationManager); if (!var8.superConstructor.equals(this.classInfo.getName())) { ListIterator var10 = var6.getStatements().listIterator(); Iterator var11 = this.instanceInitializer.iterator(); while(var11.hasNext()) { var10.add(var11.next()); } } this.classFactory.addConstructor(var6.getAccessFlags(), var3, var13, var8.superConstructor, var8.constructorParameters); } } } protected void addInnerClassesAttribute(ClassInfo var1) { for(ClassInfo var2 = var1.getDeclaringClass(); var2 != null; var2 = var2.getDeclaringClass()) { String var3 = var1.getName(); String var4 = var2.getName(); InnerClassesEntry var5 = this.classFactory.addInnerClassesEntry(); var5.setInnerClassInfo(var3); var5.setOuterClassInfo(var4); var5.setInnerName(var3.substring(var4.length() + 1, var3.length())); var5.setInnerClassAccessFlags((short)var1.getModifiers()); var1 = var2; } } protected void addToClassInitializer(Node var1) { this.classInitializer.add(var1); } protected void addToInstanceInitializer(Node var1) { this.instanceInitializer.add(var1); } // $FF: synthetic method static void access$0(Class var0) { class$Ljava$lang$Object = var0; } // $FF: synthetic method static Class access$1() { return class$Ljava$lang$Object; } // $FF: synthetic method static void access$2(Class var0) { class$Ljava$lang$String = var0; } // $FF: synthetic method static Class access$3() { return class$Ljava$lang$String; } // $FF: synthetic method static Class class$(String var0) { try { return Class.forName(var0); } catch (ClassNotFoundException var2) { throw new NoClassDefFoundError(((Throwable)var2).getMessage()); } } public ClassInfoCompiler(ClassInfo var1) { MembersVisitor var10001 = new MembersVisitor; if (this == null) { throw null; } else { var10001.<init>(this); this.membersVisitor = var10001; this.classInfo = (TreeClassInfo)var1; this.typeDeclaration = this.classInfo.getTypeDeclaration(); this.classFinder = (TreeClassFinder)this.classInfo.getClassFinder(); this.importationManager = var1.getDeclaringClass() != null ? this.classFinder.getImportationManager() : (ImportationManager)this.classFinder.getImportationManager().clone(); this.interpreter = (TreeInterpreter)this.classFinder.getInterpreter(); this.isInterface = this.classInfo.isInterface(); } } }